package practice6;

import java.util.Scanner;

public class Ac1051 {
    static int N=50010;
    static int[] a=new int[N];	//表示数组的值
    //以i为划分，所求g[i]+h[i]的最大值即为所求结果的最大值
    static int[] g=new int[N];	//g[i]表示从1~i中连续子段和的最大值
    static int[] h=new int[N];	//h[i]表示从i~n中连续子段和的最大值
    static int[] dp=new int[N]; //dp[i]表示1~i中以i为结尾的连续子段和的最大值
    static int INF=(int)1e9;
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        int n=sc.nextInt();
        for(int i=1;i<=n;i++) {
            a[i]=sc.nextInt();
        }
        //求出所有的g[i]
        dp[0]=g[0]=-INF;
        for(int i=1;i<=n;i++) {
            dp[i]=Math.max(dp[i-1]+a[i],a[i]);	//一种是只有a[i],一种是长度至少为2
            g[i]=Math.max(g[i-1],dp[i]);
        }
        //求出所有的h[i],相当于上面倒着来一遍
        dp[n+1]=h[n+1]=-INF;
        for(int i=n;i>=1;i--) {
            dp[i]=Math.max(dp[i+1], a[i]);
            h[i]=Math.max(h[i+1], dp[i]);
        }
        int ans=-INF;
        for(int i=1;i<=n;i++) {
            ans=Math.max(ans,g[i]+h[i+1]);
        }
        System.out.println(ans);
    }
}
